﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QuanLyHocPhi.Model;
using QuanLyHocPhi.BLL;

namespace QuanLyHocPhi.BLL
{
    /// <summary>
    /// Lớp xử lý nghiệp vụ liên quan đến thực thể học kỳ
    /// </summary>
    partial class BizHocKy
    {
        internal static HocKy AddHocKy(string namHoc, int hocKy)
        {
            using (var context = new QLHPEntities())
            {
                var oNamHoc = context.NamHocDbSet.Where(e => e.TenNamHoc == namHoc).FirstOrDefault();
                if (oNamHoc == null)
                {
                    // Tạo năm học
                    oNamHoc = new NamHoc() { TenNamHoc = namHoc };
                    context.NamHocDbSet.Add(oNamHoc);
                }

                var oHocKy = context.HocKyDbSet.Where(e => e.MaNamHoc == namHoc && e.TenHocKy == hocKy).FirstOrDefault();
                if (oHocKy != null)
                    throw new Exception(string.Format("Học kỳ {0} của năm học {1} đã tồn tại", 
                        hocKy, oNamHoc.ToString()));
                oHocKy = new HocKy() { MaHocKy = Guid.NewGuid().ToString(), TenHocKy = hocKy, NamHoc = oNamHoc };
                context.HocKyDbSet.Add(oHocKy);

                context.SaveChanges();
                return oHocKy;
            }
        }

        internal static void DeleteHocKy(HocKy hocKy)
        {
            using (var context = new QLHPEntities())
            {
                var oHocKy = context.HocKyDbSet.Where(e => e.MaHocKy == hocKy.MaHocKy).FirstOrDefault();
                if (oHocKy == null)
                    throw new Exception("Học kỳ không còn tồn tại trên hệ thống");
                try
                {
                    context.HocKyDbSet.Remove(oHocKy);
                    context.SaveChanges();
                }
                catch (Exception exc)
                {
                    throw new Exception("Không thể xoá học kỳ được.\nChi tiết lỗi: " + exc.Message);
                }
            }
        }


        /// <summary>
        /// Lấy danh sách các năm học
        /// </summary>
        /// <returns></returns>
        internal static IList<string> GetList_NamHoc()
        {
            using (var context = new QLHPEntities())
            {
                var lstGroupNamHoc = from hocky in context.HocKyDbSet
                                     group hocky by hocky.NamHoc into NamHocGroup
                                     orderby NamHocGroup.Key descending
                                     select new { NamHoc = NamHocGroup.Key };
                var lstNamHoc = new List<string>();
                foreach (var group in lstGroupNamHoc)
                    lstNamHoc.Add(group.NamHoc.ToString());
                return lstNamHoc;
            }
        }

        /// <summary>
        /// Lấy danh sách học kỳ trong một năm học cụ thể
        /// </summary>
        /// <param name="namHoc"></param>
        /// <returns></returns>
        internal static IList<HocKy> GetList_HocKy(string tenNamHoc)
        {
            using (var context = new QLHPEntities())
            {
                var lst = (
                    from hk in context.HocKyDbSet
                    orderby hk.NamHoc.TenNamHoc descending, hk.TenHocKy ascending
                    where hk.NamHoc.TenNamHoc == tenNamHoc
                    select hk
                ).ToList().ToSortableBindingList();
                return lst;
            }
        }

        /// <summary>
        /// Khởi tạo giá trị cho một học kỳ mặc định
        /// </summary>
        /// <returns></returns>
        internal static HocKy GetDefaultNew_HocKy()
        {
            return new HocKy
            {
                MaHocKy = System.Guid.NewGuid().ToString(),
                TenHocKy = 1,
            };
        }

        /// <summary>
        /// Xoá học kỳ
        /// </summary>
        /// <param name="hocKy"></param>
        internal static void Delete_HocKy(HocKy hocKy)
        {
            using (var context = new QLHPEntities())
            {
                var oHocKy = (from hk in context.HocKyDbSet
                              where hk.MaHocKy == hocKy.MaHocKy
                              select hk).FirstOrDefault();
                if (oHocKy == null)
                    throw new Exception("Học kỳ này không còn tồn tại!");
                else
                {
                    try
                    {
                        context.HocKyDbSet.Remove(oHocKy);
                        context.SaveChanges();
                    }
                    catch (Exception exc)
                    {
                        throw new Exception("Không thể xoá học kỳ được! Chi tiết lỗi: " + exc.Message);
                    }
                }
            }
        }

        /// <summary>
        /// Bổ sung học kỳ
        /// </summary>
        /// <param name="hocKy"></param>
        internal static void AddNew_HocKy(HocKy hocKy)
        {
            using (var context = new QLHPEntities())
            {
                int count = (from hk in context.HocKyDbSet
                             where hk.MaNamHoc == hocKy.MaNamHoc && hk.TenHocKy == hocKy.TenHocKy
                             select hk).Count();
                if (count > 0)
                    throw new Exception("Học kỳ này đã tồn tại!");
                else
                    try
                    {
                        {
                            context.HocKyDbSet.Add(hocKy);
                            context.SaveChanges();
                        }
                    }
                    catch (Exception exc)
                    {
                        throw new Exception("Không thể bổ sung học kỳ. Chi tiết lỗi: " + exc.Message);
                    }
            }
        }

        /// <summary>
        /// Chỉnh sửa học kỳ
        /// </summary>
        /// <param name="hocKy"></param>
        internal static void Update_HocKy(HocKy hocKy)
        {
            using (var context = new QLHPEntities())
            {
                int count = (from hk in context.HocKyDbSet
                             where
                                hk.NamHoc == hocKy.NamHoc &&
                                hk.TenHocKy == hocKy.TenHocKy &&
                                hk.MaHocKy != hocKy.MaHocKy
                             select hk).Count();
                if (count > 0)
                    throw new Exception("Học kỳ này đã tồn tại!");

                var oHocKy = (from hk in context.HocKyDbSet
                              where hk.MaHocKy == hocKy.MaHocKy
                              select hk).FirstOrDefault();
                if (hocKy == null)
                    throw new Exception("Học kỳ này chưa tồn tại!");
                try
                {
                    oHocKy.NamHoc = hocKy.NamHoc;
                    oHocKy.TenHocKy = hocKy.TenHocKy;
                    context.SaveChanges();
                }
                catch (Exception exc)
                {
                    throw new Exception("Không thể chỉnh sửa học kỳ! Chi tiết lỗi: " + exc.Message);
                }
            }
        }

        internal static HocKy GetHocKyByMaHK(string maHocKy)
        {
            using (var context = new QLHPEntities())
            {
                return context.HocKyDbSet.FirstOrDefault(e => e.MaHocKy == maHocKy);
            }
        }
    }
}
